package com.xd.study.activity;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;

import com.xd.study.R;
import com.xd.study.utility.MyBindService;
import com.xd.study.utility.MyStartService;

/**
 * Created by DGF on 2015/5/5.
 * Service 用途：播放音乐，记录地理位置信息的改变，监听某种动作
 *
 * 运行与主线程，不能用来做耗时的请求或者动作
 * 若需要做耗时的动作，可以在服务中开一个子线程，在线程中做耗时操作
 *
 * Service 类型：
 * 本地服务：运行于程序内部
 * startService stopService stopSelf stopSelfResult
 * bindService unbindService
 * 远程服务：运行于Android系统内部的多个应用程序之间
 * 定义IBinder接口
 *
 * Start方式特点：
 * 服务跟启动源没有任何联系
 * 无法得到服务对象
 *
 * Bind方式特点：
 * 通过Ibinder接口实例，返回一个ServiceConnection对象给启动源
 * 通过ServiceConnection的相关方法可以得到Service对象
 */
public class ServiceActivity extends Activity {

    private Intent intent1;
    private Intent intent2;

    private MyBindService myBindService = null;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        /**
         * 当启动源与service成功连接后，调用该方法
         * @param name
         * @param service
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBindService = ((MyBindService.MyBinder)service).getService();
        }

        /**
         * 当启动源与service的连接意外丢失，调用该方法
         * 例如：service崩溃，或service被杀死
         * @param name
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service);

        Button btnStart = (Button)this.findViewById(R.id.service_btn_start);
        Button btnStop = (Button)this.findViewById(R.id.service_btn_stop);
        Button btnBind = (Button)this.findViewById(R.id.service_btn_bind);
        Button btnPlay = (Button)this.findViewById(R.id.service_btn_start);
        Button btnPause = (Button)this.findViewById(R.id.service_btn_pause);
        Button btnPrevious = (Button)this.findViewById(R.id.service_btn_previous);
        Button btnNext = (Button)this.findViewById(R.id.service_btn_next);
        Button btnUnbind = (Button)this.findViewById(R.id.service_btn_unbind);

        /**
         * start方式启动服务         *
         */
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                intent1 = new Intent(ServiceActivity.this, MyStartService.class);
                startService(intent1);
            }
        });

        /**
         * 停止服务
         */
        btnStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (intent1 != null) {
                    stopService(intent1);
                }
            }
        });

        /**
         * bind方式启动服务
         */
        btnBind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                intent2 = new Intent(ServiceActivity.this, MyBindService.class);

                /**
                 * Service.BIND_AUTO_CREATE : 让服务自动创建
                 * 如果既想应用程序与服务分离，又可以回传数据，则可以混合使用
                 * 关闭应用程序时要stopService，unbindService
                 */
//                startService(intent2);
                bindService(intent2, serviceConnection, Service.BIND_AUTO_CREATE);
            }
        });

        /**
         * 开始播放
         */
        btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myBindService != null) {
                    myBindService.play();
                }
            }
        });

        /**
         * 暂停播放
         */
        btnPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myBindService != null) {
                    myBindService.pause();
                }
            }
        });

        /**
         * 上一首
         */
        btnPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myBindService != null) {
                    myBindService.previous();
                }
            }
        });

        /**
         * 下一首
         */
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (myBindService != null) {
                    myBindService.next();
                }
            }
        });

        /**
         * 解绑服务
         * bind方式的服务，在应用程序退出时，必须先解绑定服务
         */
        btnUnbind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (serviceConnection != null) {
                    unbindService(serviceConnection);
                }
            }
        });
    }

    @Override
    protected void onDestroy() {

        if (serviceConnection != null){
            unbindService(serviceConnection);
        }
        if (intent2 != null) {
            stopService(intent2);
        }

        super.onDestroy();
    }
}
